昨天我們已經取得了 Olist 數據庫的「建築設計圖」!
今天,我們要正式進入輕量級 ETL 的第一步:Extract(萃取)。
打開 VS Code,建立一個新的專案資料夾(例如命名為 olist_etl_project)。
終端機(Terminal),輸入以下指令:
Mac/Linux 使用者:
Bash
python -m venv .venv
source .venv/bin/activate
Windows 使用者:
Windows 使用者:
Bash
python -m venv .venv
.venv\Scripts\activate
pip install pandas jupyter
實作紀錄
環境建置後,請先在專案底下建立一個 data/ 資料夾,並把從 Kaggle 下載下來的 9 個.csv 檔案通通放進去。
面對到 9 項檔案,感覺的做法是宣告 9 個變數,寫 9 行 pd.read_csv(),這確實在單一檔案分析時很常見。
但在建構 ETL 管線時,我覺得可能會看重的是以下這兩種吧!
[ 「未來的擴充性」與「變數管理的整潔度」 ] ( 我思考的 ![]()
可以透過下表,快速比較這兩種思維的差異:
| 比較面向 | 一般逐一讀取 (手動宣告) | 動態批次讀取 (進階思維) |
|---|---|---|
| 實作方式 | 為每張表寫一行 Code 並賦予變數名稱 | 使用 os.listdir() 搭配迴圈自動掃描 |
| 程式碼長度 | 隨表格數量線性增加(9 張表 = 9 行) | 固定行數,維持 DRY(不重複造輪子)原則 |
| 擴充性 | 較低。若明天新增 3 份檔案,需手動修改程式 | 極高。新增再多檔案也完全不用改 Code |
| 變數管理 | 工作區散落多個 DataFrame 變數,不易管理 | 統一收納在 1 個 Python 字典 (dict) 裡,結構清晰 |
作了簡易的範例 - 如下
import pandas as pd
import os
# 指定資料夾路徑
data_path = "./data/"
# 建立一個空的字典,用來統一存放所有表格
olist_db = {}
# 讓程式自動找出資料夾內所有的 .csv 檔案
for file_name in os.listdir(data_path):
if file_name.endswith(".csv"):
# 去掉附檔名,把乾淨的檔案名稱當作字典的 Key
table_name = file_name.replace(".csv", "")
# 讀取檔案,並存為字典的 Value (也就是 DataFrame)
olist_db[table_name] = pd.read_csv(os.path.join(data_path, file_name))
# 驗證看看我們讀進了哪些表?
print("成功載入以下資料表:")
print(olist_db.keys())
實作 如圖 所示
未來需要作分析特定表單時,只要呼叫字典一樣輸入 olist_db['olist_orders_dataset'],
就能立刻將指定的 DataFrame 拿出來用 !
這正是利用模組化與自動化思維,將重複性勞動降到最低的最佳示範。
今天我們建立了乾淨的開發環境,
並親自實作了能自動適應檔案數量的動態讀取腳本,順利完成輕量級 ETL 的 Extract (萃取) 階段。
接下來遇到的是資料讀進來後,裡面是長得乾乾淨淨?還是充滿可怕的空值(NaN)與亂碼呢?
明天,我們將展開「資料健康檢查」,正式進入 EDA(探索性資料分析) 的環節!
See you later.